
package com.jelly.config.mybatis;

import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.*;
import org.mybatis.generator.api.dom.xml.Attribute;
import org.mybatis.generator.api.dom.xml.TextElement;
import org.mybatis.generator.api.dom.xml.XmlElement;

import java.util.List;

public class MySQLLimitPlugin extends PluginAdapter {

    /**
     * 为每个Example类添加limit和offset属性已经set、get方法
     */
    @Override
    public boolean modelExampleClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {

	PrimitiveTypeWrapper integerWrapper = FullyQualifiedJavaType.getIntInstance().getPrimitiveTypeWrapper();

	Field limit = new Field();
	limit.setName("limit");
	limit.setVisibility(JavaVisibility.PRIVATE);
	limit.setType(integerWrapper);
	topLevelClass.addField(limit);

	Method setLimit = new Method();
	setLimit.setVisibility(JavaVisibility.PUBLIC);
	setLimit.setName("setLimit");
	setLimit.addParameter(new Parameter(integerWrapper, "limit"));
	setLimit.addBodyLine("this.limit = limit;");
	topLevelClass.addMethod(setLimit);

	Method getLimit = new Method();
	getLimit.setVisibility(JavaVisibility.PUBLIC);
	getLimit.setReturnType(integerWrapper);
	getLimit.setName("getLimit");
	getLimit.addBodyLine("return limit;");
	topLevelClass.addMethod(getLimit);

	Field offset = new Field();
	offset.setName("endLimit");
	offset.setVisibility(JavaVisibility.PRIVATE);
	offset.setType(integerWrapper);
	topLevelClass.addField(offset);

	Method setOffset = new Method();
	setOffset.setVisibility(JavaVisibility.PUBLIC);
	setOffset.setName("setEndLimit");
	setOffset.addParameter(new Parameter(integerWrapper, "endLimit"));
	setOffset.addBodyLine("this.endLimit = endLimit;");
	topLevelClass.addMethod(setOffset);

	Method getOffset = new Method();
	getOffset.setVisibility(JavaVisibility.PUBLIC);
	getOffset.setReturnType(integerWrapper);
	getOffset.setName("getEndLimit");
	getOffset.addBodyLine("return endLimit;");
	topLevelClass.addMethod(getOffset);

	return true;
    }

    /**
     * 为Mapper.xml的selectByExample添加limit
     */
    @Override
    public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element,
	    IntrospectedTable introspectedTable) {

	XmlElement ifLimitNotNullElement = new XmlElement("if");
	ifLimitNotNullElement.addAttribute(new Attribute("test", "limit != null"));

	XmlElement ifOffsetNotNullElement = new XmlElement("if");
	ifOffsetNotNullElement.addAttribute(new Attribute("test", "limit != null"));
	ifOffsetNotNullElement.addElement(new TextElement("limit ${limit}, ${endLimit}"));
	ifLimitNotNullElement.addElement(ifOffsetNotNullElement);

	XmlElement ifOffsetNullElement = new XmlElement("if");
	ifOffsetNullElement.addAttribute(new Attribute("test", "endLimit == null"));
	ifOffsetNullElement.addElement(new TextElement("limit ${endLimit}"));
	ifLimitNotNullElement.addElement(ifOffsetNullElement);

	element.addElement(ifLimitNotNullElement);

	return true;
    }

    @Override
    public boolean validate(List<String> list) {

	return true;
    }
}